package com.wiselink.elevenstreet.productcatalog;

import com.alibaba.fastjson2.JSON;
import com.wiselink.elevenstreet.ElevenStreetBaseAPI;
import com.wiselink.exception.ElevenStException;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 商品注册
 */
public class ProductCreation extends ElevenStreetBaseAPI {

    public static final String path = "/rest/seller/v2/products";

    /**
     * 商品注册
     *
     * @param request 商品注册请求体
     * @return 商品注册成功后的ID
     */
    public static Long execute(Request request, String openapiKey) {
        String result = post(JSON.toJSONString(request), path, openapiKey);
        Response response = JSON.parseObject(result, Response.class);
        if (Objects.equals(response.resultCode, "200")) {
            return response.getData();
        }
        throw new ElevenStException(response.getMessage());
    }

    /**
     * 产品注册请求体
     */
    @Getter
    @Setter
    @ToString
    public static class Request {
        /**
         * productTypeCode String 필수(必填) 서비스 상품 코드 01 : 일반배송상품
         * <p>
         * 服务商品代码
         * 01：普通配送商品
         */
        private String productTypeCode;

        /**
         * productStatusCode String 필수(必填) 상품상태
         * 01:새상품
         * 02:중고상품 (판매방식이 ""중고판매""인 경우만 선택가능합니다.)
         * 03:재고상품
         * 04:리퍼상품(판매방식이 ""중고판매""인 경우만 선택가능합니다.)
         * 05:전시(진열)상품(판매방식이 ""중고판매""인 경우만 선택가능합니다.)
         * 07:희귀소장품(판매방식이 ""중고판매""인 경우만 선택가능합니다.)
         * 08:반품상품(판매방식이 ""중고판매""인 경우만 선택가능합니다.)
         * 09:스크래치상품(판매방식이 ""중고판매""인 경우만 선택가능합니다.)
         * 10:주문제작상품
         * <p>
         * 商品状态
         * 01：全新品
         * 02：二手商品（仅当销售方式为“二手销售”时可选）
         * 03：库存商品
         * 04：翻新商品（仅当销售方式为“二手销售”时可选）
         * 05：展示（陈列）商品（仅当销售方式为“二手销售”时可选）
         * 07：稀有收藏品（仅当销售方式为“二手销售”时可选）
         * 08：退货商品（仅当销售方式为“二手销售”时可选）
         * 09：划痕商品（仅当销售方式为“二手销售”时可选）
         * 10：定制商品
         */
        private String productStatusCode;

        /**
         * displayCategoryNo Number 필수(必填) 카테고리번호 최하위 카테고리만 입력가능합니다.
         * <p>
         * 分类编号
         * 只能输入最下级分类编号
         */
        private String displayCategoryNo;

        /**
         * productName String 필수(必填) 상품명
         * 글자수는 100Byte로 제한됩니다. 한글 50자, 영문/숫자 100자 이내로 입력을 권장합니다.
         * 입력이 불가한 특수문자가 포함될 경우, 해당 문자는 상품명에서 자동 미노출처리 됩니다
         * *단일상품명은 등록 15일 이후 상품명 수정이 불가능합니다.
         * 빈번한 수정이 필요한 부분은 홍보상품명 영역을 활용해주세요. 클린 상품명은 검색 노출에
         * 도움이 될 수 있습니다.
         * <p>
         * 商品名称
         * 字节数限制为100字节，建议输入韩文50字、英文/数字100字以内。
         * 若包含无法输入的特殊字符，该字符将在商品名称中自动隐藏。
         * *单品名称在注册15天后无法修改。
         * 如需频繁修改，请使用促销商品名区域。干净的商品名称有助于搜索曝光。
         */
        private String productName;

        /**
         * productEnglishName String 비필수(非必填) 영문 상품명 글자수는 100Byte 로 제한됩니다. 영문/숫자 100자 이내로 입력해 주십시오.
         * 입력이 불가한 특수문자가 포함될 경우, 해당 문자는 상품명에서 자동 미노출처리 됩니다.
         * <p>
         * 英文商品名称
         * 字节数限制为100字节，请输入英文/数字100字以内。
         * 若包含无法输入的特殊字符，该字符将在商品名称中自动隐藏。
         */
        private String productEnglishName;

        /**
         * advertisementPhrase String 비필수(非必填) 상품홍보문구 글자수는 28Byte로 제한됩니다. 한글 14자, 영문/숫자 28자 이내로 입력을 권장합니다. 클린
         * 홍보문구는 검색 노출에 도움이 될 수 있습니다.
         * <p>
         * 商品宣传语
         * 字节数限制为28字节，建议输入韩文14字、英文/数字28字以内。
         * 干净的宣传语有助于搜索曝光。
         */
        private String advertisementPhrase;

        /**
         * sellerManagementCode String 비필수(非必填) 판매자 상품코드
         * <p>
         * 卖家商品代码（非必填）
         */
        private String sellerManagementCode;

        /**
         * stockQuantity Number 필수(必填) 재고수량 옵션이 있을 경우 입력값과 상관없이 옵션수량의 총합으로 자동계산 되어 반영됩니다.
         * 재고는 0으로 입력할 수 없습니다.
         * <p>
         * 库存数量
         * 若存在选项，无论输入值如何，都会自动计算为选项数量的总和。
         * 库存数量不能输入为0。
         */
        private String stockQuantity;

        /**
         * standardProductYn String 비필수(非必填) 신규상품여부
         * Y: 신규상품
         * N: 일반상품
         * (기본값: 일반상품)
         * <p>
         * 是否为新品
         * Y：新品
         * N：普通商品
         * （默认值：普通商品）
         */
        private String standardProductYn;

        /**
         * sellPrice Number 필수(必填) 판매가 판매가는 10원 단위로, 최대 10억 원 미만으로 입력 가능합니다.
         * <p>
         * 销售价
         * 以10韩元为单位输入，最大不得超过10亿韩元。
         */
        private String sellPrice;

        /**
         * priceComparisonYn String 비필수(非必填) 가격비교 사이트 등록 여부 Y : 등록함
         * N : 등록안함
         * <p>
         * 是否在比价网站注册
         * Y：已注册
         * N：未注册
         */
        private String priceComparisonYn;

        /**
         * taxCode String 비필수(非必填) 부가세/면세상품코드
         * 01:과세상품
         * 02:면세상품
         * 03:영세상품
         * <p>
         * 增值税/免税商品代码
         * 01：应税商品
         * 02：免税商品
         * 03：零税商品
         */
        private String taxCode;

        /**
         * giftWrappingCode String 비필수(非必填) 선물포장 유형코드
         * 01:불가
         * 02:선물포장
         * 03:포장재동봉
         * 04:선물포장 + 포장재동봉
         * <p>
         * 礼品包装类型代码
         * 01：不可
         * 02：礼品包装
         * 03：附带包装材料
         * 04：礼品包装 + 附带包装材料
         */
        private String giftWrappingCode;

        /**
         * tagName String[] 비필수(非必填) 태그 최대 10개
         * <p>
         * 标签，最多可输入10个
         */
        private String[] tagName;

        /**
         * beefTraceTypeCode String 조건부 필수(有条件的必填) 축산물 이력 구분코드
         * 식품> 축산 > 수입쇠고기 카테고리 선택 시 축산물 이력번호는 필수 입력 사항입니다.
         * 01:이력번호 표시대상 제품
         * 02:이력번호 표시대상 아님
         * 03:상세설명 참조
         * <p>
         * 畜产品溯源区分代码
         * 当选择 食品 > 畜产 > 进口牛肉 分类时，必须填写畜产品溯源编号。
         * 01：溯源编号标示对象产品
         * 02：非标示对象产品
         * 03：参见详细说明
         */
        private String beefTraceTypeCode;

        /**
         * beefTraceContent String 비필수(非必填) 이력번호 표시대상 내용
         * 축산물 이력 구분코드 (beefTraceTypeCode) 가 01인 경우 이력번호 표시대상 제품(xxxx)에
         * 들어갈 내용을 입력합니다.
         * 글자수는 20Byte 로 제한됩니다. 한글 10자, 영문/숫자 20자 이내로 입력해 주십시오
         * <p>
         * 溯源编号标示内容
         * 当畜产品溯源区分代码（beefTraceTypeCode）为01时，输入溯源编号标示产品的内容（xxxx）。
         * 字节数限制为20字节，建议韩文10字、英文/数字20字以内。
         */
        private String beefTraceContent;

        /**
         * 비필수(非必填) 해외직구 글로벌 셀러만 사용가능
         * <p>
         * 海外直购，仅限全球卖家使用（非必填）
         */
        private Abroad abroad;

        /**
         * 필수(必填) 판매정보
         * <p>
         * 销售信息（必填）
         */
        private Selling selling;

        /**
         * 필수(必填) 브랜드
         * <p>
         * 品牌（必填）
         */
        private Brand brand;

        /**
         * 조건부 필수(有条件的必填) 원재료 원재료 입력 대상 카테고리인 경우 필수
         * <p>
         * 原材料（有条件必填）
         * 属于需填写原材料的分类时必填
         */
        private RawMaterial rawMaterial;

        /**
         * 필수(必填) 원산지
         * <p>
         * 原产地（必填）
         */
        private Origin origin;

        /**
         * 조건부 필수(有条件的必填) 중고상품
         * <p>
         * 二手商品（有条件必填）
         */
        private Used used;

        /**
         * 필수(必填) 이미지
         * <p>
         * 图片（必填）
         */
        private Image image;

        /**
         * 필수(必填) 상세내용
         * <p>
         * 详细内容（必填）
         */
        private DetailContent detailContent;

        /**
         * 필수(必填) 인증정보
         * <p>
         * 认证信息（必填）
         */
        private Certification certification;

        /**
         * 비필수(非必填) 의료기기 품목허가
         * <p>
         * 医疗器械品目许可（非必填）
         */
        private Medical medical;

        /**
         * 비필수(非必填) 리뷰
         * <p>
         * 评论（非必填）
         */
        private Review review;

        /**
         * 비필수(非必填) 즉시할인
         * <p>
         * 立即折扣（非必填）
         */
        private SellerDiscount sellerDiscount;

        /**
         * 비필수(非必填) SK Pay 포인트
         * <p>
         * SK Pay 积分（非必填）
         */
        private Point point;

        /**
         * 비필수(非必填) 복수구매할인
         * <p>
         * 多件购买折扣（非必填）
         */
        private MultiPurchaseDiscount multiPurchaseDiscount;

        /**
         * 비필수(非必填) 희망후원
         * <p>
         * 希望捐赠（非必填）
         */
        private HopeSupport hopeSupport;

        /**
         * 비필수(非必填) 추가구성상품
         * <p>
         * 附加构成商品（非必填）
         */
        private Composition composition;

        /**
         * 비필수(非必填) 구매제한
         * <p>
         * 购买限制（非必填）
         */
        private PurchaseLimit purchaseLimit;

        /**
         * 비필수(非必填) 사은품
         * <p>
         * 赠品（非必填）
         */
        private Gift gift;

        /**
         * 필수(必填) 상품정보제공고시 상품정보고시 참조
         * <p>
         * 商品信息提供公示（必填）
         * 请参考商品信息公示
         */
        private Notification notification;

        /**
         * 필수(必填) 모델
         * <p>
         * 型号（必填）
         */
        private Model model;

        /**
         * 필수(必填) 배송
         * <p>
         * 配送（必填）
         */
        private Delivery delivery;

        /**
         *
         */
        private TodaySend todaySend;

        /**
         * 조건부 필수(有条件的必填) 도서/음반/DVD
         * <p>
         * 书籍/音像/DVD（有条件必填）
         */
        private BookAndAlbum bookAndAlbum;

        /**
         * 비필수(非必填) 옵션
         * <p>
         * 选项（非必填）
         */
        private Option option;
    }

    @Getter
    @Setter
    @ToString
    public static class Response {
        /**
         * data Number 상품번호
         */
        private Long data;
        /**
         * resultCode String 응답 코드
         */
        private String resultCode;
        /**
         * message String 응답 메세지
         */
        private String message;
    }

    /**
     * 해외직구 글로벌 셀러만 사용가능
     * <p>
     * 海外直购，仅限全球卖家使用
     */
    @Getter
    @Setter
    @ToString
    public static class Abroad {
        /**
         * placeCode String 조건부 필수(有条件的必填) 해외상품구입처코드
         * 해외구매대행상품코드(purchasingAgentServiceCode)가 '02' 이면 필수
         * A:해당 브랜드 정식 도매
         * B:해당 브랜드 직영 온,오프라인 매장(백화점포함)
         * C:오프라인 아울렛
         * D:현지 온라인 쇼핑몰
         * E:A~D에 해당되지 않는 구입처(경매 등)
         * <p>
         * 海外商品购买地代码（有条件必填）
         * 当海外代购商品代码(purchasingAgentServiceCode)为“02”时必填。
         * A：该品牌正式批发渠道
         * B：该品牌直营线上或线下门店（包括百货商店）
         * C：线下奥特莱斯
         * D：当地线上购物商城
         * E：不属于A~D的购买渠道（如拍卖等）
         */
        private String placeCode;

        /**
         * sizeTableDisplayYn String 비필수(非必填) 해외사이즈 조견표 노출여부
         * <p>
         * 是否显示海外尺码对照表（非必填）
         */
        private String sizeTableDisplayYn;

        /**
         * abroadInCode String 조건부 필수(有条件的必填) 11번가 해외 입고 유형
         * 배송 주체 코드(deliveryClassificationCode)가 03(11번가 해외 배송)인 경우 필수입니다.
         * 상품의 출고지가 11번가 무료 픽업 가능 지역인 경우: 11번가 무료 픽업
         * 판매자 직접 발송인 경우: 판매자발송
         * 구매 대행인 경우: 구매 대행
         * 01:11번가 무료 픽업
         * 02:판매자발송
         * 03:구매 대행
         * <p>
         * 11街海外入库类型（有条件必填）
         * 当配送主体代码(deliveryClassificationCode)为03（11街海外配送）时必填。
         * 若商品出库地为11街免费取件区域：11街免费取件
         * 若卖家直接发货：卖家发货
         * 若为代购：代购
         * 01：11街免费取件
         * 02：卖家发货
         * 03：代购
         */
        private String abroadInCode;

        /**
         * hsCode String 조건부 필수(有条件的必填) 관세코드
         * 배송비설정기준코드(chargeTypeCode)가 (10)11번가해외배송조건부배송비 (11번가 해외 배
         * 송을 사용하는 경우)일 때 필수입니다.
         * <a href="http://image.11st.co.kr/openapi/hscode.xlsx">...</a>
         * <p>
         * 海关关税代码（有条件必填）
         * 当运费设置基准代码(chargeTypeCode)为10（11街海外配送条件运费，即使用11街海外配送）时必填。
         * 可参考关税代码表链接。
         */
        private String hsCode;

        /**
         * purchasingAgentServiceCode
         * String 비필수(非必填) 해외구매대행상품코드 01:일반판매상품
         * 02:해외판매대행상품
         * <p>
         * 海外代购商品代码（非必填）
         * 01：一般销售商品
         * 02：海外代销商品
         */
        private String purchasingAgentServiceCode;

        /**
         * importFeeCode String 비필수(非必填) 관부가세 포함 코드
         * 01:포함
         * 02:미포함
         * 03:표시하지 않음
         * <p>
         * 关税及增值税包含代码（非必填）
         * 01：已包含
         * 02：未包含
         * 03：不显示
         */
        private String importFeeCode;
    }

    /**
     * 销售信息
     */
    @Getter
    @Setter
    @ToString
    public static class Selling {
        /**
         * statusCode String 비필수(非必填) 판매상태 103 : 판매중
         * 105 : 판매중지
         * <p>
         * 销售状态
         * 103：销售中
         * 105：销售中止
         */
        private String statusCode;

        /**
         * methodCode String 필수(必填) 판매방식
         * 01:고정가판매
         * 02:사용안함 (API 미지원)
         * 03:사용안함 (API 미지원)
         * 04:예약판매
         * 05:중고판매
         * <p>
         * 销售方式
         * 01：固定价格销售
         * 02：未使用（API不支持）
         * 03：未使用（API不支持）
         * 04：预约销售
         * 05：二手销售
         */
        private String methodCode;

        /**
         * usePeriodYn String 비필수(非必填) 판매기간 Y: 판매기간 지정이 가능합니다.
         * N:고정가판매의 경우만. 즉시 영구 판매가 이루어 집니다.
         * <p>
         * 是否设置销售期间
         * Y：可以指定销售期间
         * N：仅适用于固定价格销售，立即进行永久销售
         */
        private String usePeriodYn;

        /**
         * periodCode String 조건부 필수(有条件的必填) 판매기간코드
         * 판매방식 - "고정가판매" 혹은 "중고판매" 일 경우
         * 100:판매기간 직접입력.
         * 101:3일
         * 102:5일
         * 103:7일
         * 104:15일
         * 105:30일(1개월)
         * 106:60일(2개월)
         * 107:90일(3개월)
         * 108:120일(4개월)
         * 109:1년
         * 110:3년
         * 판매방식 - "예약판매"일 경우
         * 401:3일
         * 402:5일
         * 403:7일
         * 404:15일
         * 405:30일(1개월)
         * 406:60일(2개월)
         * 407:90일(3개월)
         * 400:예약기간 직접입력
         * <p>
         * 销售期间代码
         * 销售方式为“固定价格销售”或“二手销售”时：
         * 100：手动输入销售期间
         * 101：3天
         * 102：5天
         * 103：7天
         * 104：15天
         * 105：30天（1个月）
         * 106：60天（2个月）
         * 107：90天（3个月）
         * 108：120天（4个月）
         * 109：1年
         * 110：3年
         * 销售方式为“预约销售”时：
         * 401：3天
         * 402：5天
         * 403：7天
         * 404：15天
         * 405：30天（1个月）
         * 406：60天（2个月）
         * 407：90天（3个月）
         * 400：手动输入预约期间
         */
        private String periodCode;

        /**
         * startDate String 조건부 필수(有条件的必填) 판매 시작일/예약 시작일 YYYYMMDD
         * <p>
         * 销售开始日/预约开始日（格式：YYYYMMDD）
         */
        private String startDate;

        /**
         * endDate String 조건부 필수(有条件的必填) 판매 종료일/예약 종료일 YYYYMMDD
         * <p>
         * 销售结束日/预约结束日（格式：YYYYMMDD）
         */
        private String endDate;

        /**
         * reservationFixedPriceYn String 조건부 필수(有条件的必填) 예약판매 상품의
         * 고정가 판매기간 설정 여부
         * Y : 예약판매 종료 후 고정가 판매기간 설정
         * N : 예약판매 종료 후 고정가 판매기간 설정하지 않음
         * <p>
         * 是否设置预约销售商品的固定价格销售期间
         * Y：预约销售结束后设置固定价格销售期间
         * N：预约销售结束后不设置固定价格销售期间
         */
        private String reservationFixedPriceYn;

        /**
         * reservationPeriodCode String 조건부 필수(有条件的必填) 예약판매기간코드
         * 예약판매 상품의 고정가 판매기간 설정이 "Y"인 경우 사용가능
         * 101 : 3일
         * 102 : 5일
         * 103 : 7일
         * 104 : 15일
         * 105 : 30일(1개월)
         * 106 : 60일(2개월)
         * 107 : 90일(3개월)
         * 108 : 120일(4개월)
         * 109 : 1년
         * 110 : 3년
         * <p>
         * 预约销售期间代码
         * 当预约销售商品的固定价格销售期间设置为“Y”时可用
         * 101：3天
         * 102：5天
         * 103：7天
         * 104：15天
         * 105：30天（1个月）
         * 106：60天（2个月）
         * 107：90天（3个月）
         * 108：120天（4个月）
         * 109：1年
         * 110：3年
         */
        private String reservationPeriodCode;

        /**
         * warehouseInPlanDate String 비필수(非必填) 예약판매 상품 입고예정일
         * 입고예정일은 판매종료일과 같은 날, 혹은 그 이후로 설정해 주셔야 하며, 주문처리 시, 최대
         * 15일에 한해서 1회 연장할 수 있습니다. 입력하신 입고예정일은 상품상세 페이지에 안내되
         * 며, 입고예정일 지연 시, 신용점수가 차감되오니, 유의해 주십시오.
         * <p>
         * 预约销售商品的预计入库日期
         * 入库日期必须设置为销售结束日当天或之后。订单处理时最多可延长15天一次。
         * 输入的入库预计日期会显示在商品详情页中。
         * 若入库日期延迟，信用评分将被扣减，请注意。
         */
        private String warehouseInPlanDate;
    }

    /**
     * 브랜드
     * <p>
     * 品牌
     */
    @Getter
    @Setter
    @ToString
    public static class Brand {
        /**
         * name String 필수(必填) 브랜드명
         * 브랜드를 정확히 입력하면 해당 상품의 검색 노출이 더 많아집니다. 브랜드는 텍스트 형태
         * 로만 입력 가능하며 브랜드 관련 서비스에 전시를 위해서는 브랜드명을 정확히 입력해 주셔
         * 야 합니다.
         * <p>
         * 品牌名称
         * 准确输入品牌名称可提高商品的搜索曝光度。品牌只能以文字形式输入，
         * 为了在与品牌相关的服务中展示，请务必准确填写品牌名称。
         */
        private String name;

        /**
         * code String 비필수(非必填) 브랜드코드 브랜드코드 입력 시 브랜드명 보다 우선 적용됩니다.
         * <p>
         * 品牌代码
         * 若填写品牌代码，将优先于品牌名称生效。
         */
        private String code;
    }

    /**
     * 원재료 원재료 입력 대상 카테고리인 경우 필수
     * <p>
     * 原材料
     */
    @Getter
    @Setter
    @ToString
    public static class RawMaterial {
        /**
         * code String 조건부 필수(有条件的必填) 원재료 유형 코드
         * (중) 카테고리 혹은 (대) 카테고리가 원재료 입력 대상 카테고리인 경우 필수 ((중) 카테고리
         * 우선)
         * 01 : 농산물
         * 02 : 수산물
         * 03 : 가공품
         * 04 : 원산지 의무 표시대상 아님
         * 05 : 상품별 원산지는 상세설명 참조
         * <p>
         * 原材料类型代码（有条件必填）
         * 当中分类或大分类为需要填写原材料的类别时必填（以中分类为优先）。
         * 01：农产品
         * 02：水产品
         * 03：加工品
         * 04：非原产地强制标示对象
         * 05：各商品的原产地请参考详细说明
         */
        private String code;

        /**
         * 조건부 필수(有条件的必填) 원재료 상품 종류 원재료 유형이 가공품(03)일 경우 필수, 최대 10개
         * <p>
         * 原材料商品种类（有条件必填）
         * 当原材料类型为“加工品(03)”时必填，最多可填写10个。
         */
        private List<RawMaterialItem> items;
    }

    /**
     * 원재료 상품 종류 원재료 유형이 가공품(03)일 경우 필수, 최대 10개
     * <p>
     * 原材料商品种类
     */
    @Getter
    @Setter
    @ToString
    public static class RawMaterialItem {
        /**
         * name String 조건부 필수(有条件的必填) 원재료 상품명
         * <p>
         * 原材料商品名称（有条件必填）
         */
        private String name;

        /**
         * 조건부 필수(有条件的必填) 원재료 성분 농수산물 가공품인 경우 필수, 최대 5개
         * <p>
         * 原材料成分（有条件必填）
         * 当为农、水、畜产品的加工品时必填，最多可填写5个。
         */
        private List<Ingredient> ingredients;
    }

    /**
     * 원재료 성분 농수산물 가공품인 경우 필수, 최대 5개
     * <p>
     * 原材料成分
     */
    @Getter
    @Setter
    @ToString
    public static class Ingredient {
        /**
         * name String 조건부 필수(有条件的必填) 원료명
         * <p>
         * 原料名称（有条件必填）
         */
        private String name;

        /**
         * originCountry String 조건부 필수(有条件的必填) 원산지
         * <p>
         * 原产地（有条件必填）
         */
        private String originCountry;

        /**
         * content Number 조건부 필수(有条件的必填) 함량 원재료 함량을 0부터 100까지의 정수로 입력 가능하며, 원재료 상품 종류 하나의 원재료 성
         * 분 함량 총합이 100을 초과 할 수 없습니다.
         * <p>
         * 含量（有条件必填）
         * 原材料含量可输入0到100之间的整数，单个原材料商品的所有原料成分含量总和不能超过100。
         */
        private Integer content;
    }

    /**
     * 원산지
     * <p>
     * 原产地
     */
    @Getter
    @Setter
    @ToString
    public static class Origin {
        /**
         * code String 필수(必填) 원산지 코드
         * 01 : 국내. 국내원산지 코드를 같이 입력해야 합니다.
         * 02 : 해외. 해외원산지 코드를 같이 입력해야 합니다.
         * 03 : 기타. 원산지명을 입력해야합니다.
         * <p>
         * 原产地代码（必填）
         * 01：国内。需要同时填写国内原产地代码。
         * 02：海外。需要同时填写海外原产地代码。
         * 03：其他。必须填写原产地名称。
         */
        private String code;

        /**
         * detailCode String 조건부 필수(有条件的必填) 원산지 지역 코드 원산지가 국내(01), 해외(02)인 경우 필수
         * <p>
         * 原产地地区代码（有条件必填）
         * 当原产地为国内(01)或海外(02)时必填。
         */
        private String detailCode;

        /**
         * name String 조건부 필수(有条件的必填) 원산지명 원산지가 기타(03)인 경우 필수
         * <p>
         * 原产地名称（有条件必填）
         * 当原产地为“其他(03)”时必填。
         */
        private String name;
    }

    /**
     * 중고상품
     * <p>
     * 二手商品
     */
    @Getter
    @Setter
    @ToString
    public static class Used {
        /**
         * useMonth Number 조건부 필수(有条件的必填) 사용개월수 판매방식(selling.methodCode)이 중고판매(05) 인 경우 필수
         * <p>
         * 使用月数（有条件必填）
         * 当销售方式(selling.methodCode)为“二手销售(05)”时必填。
         */
        private Integer useMonth;

        /**
         * purchasePrice Number 조건부 필수(有条件的必填) 구입당시 판매가 판매방식(selling.methodCode)이 중고판매(05) 인 경우 필수
         * <p>
         * 购买时销售价格（有条件必填）
         * 当销售方式(selling.methodCode)为“二手销售(05)”时必填。
         */
        private BigDecimal purchasePrice;

        /**
         * exteriorSpecialNote String 조건부 필수(有条件的必填) 외관/기능상 특이사항 판매방식(selling.methodCode)이 중고판매(05) 인 경우 필수
         * <p>
         * 外观/功能特殊事项（有条件必填）
         * 当销售方式(selling.methodCode)为“二手销售(05)”时必填。
         */
        private String exteriorSpecialNote;

        /**
         * manufacturerDate String 조건부 필수(有条件的必填) 제조일자 판매방식(selling.methodCode)이 중고판매(05) 인 경우 필수, YYYYMMDD
         * <p>
         * 制造日期（有条件必填）
         * 当销售方式(selling.methodCode)为“二手销售(05)”时必填，格式为 YYYYMMDD。
         */
        private String manufacturerDate;

        /**
         * effectiveDate String 비필수(非必填) 유효일자 YYYYMMDD
         * <p>
         * 有效日期（非必填）
         * 日期格式为 YYYYMMDD。
         */
        private String effectiveDate;
    }

    /**
     * 이미지
     * <p>
     * 图片
     */
    @Getter
    @Setter
    @ToString
    public static class Image {
        /**
         * primaryImage String 필수(必填) 대표이미지 이미지 URL. jpg, jpeg, png 만 사용가능합니다.
         * <p>
         * 主图（必填）
         * 图片 URL，仅支持 jpg、jpeg、png 格式。
         */
        private String primaryImage;

        /**
         * cardViewImage String 비필수(非必填) 카드뷰 이미지 이미지 URL. jpg, jpeg, png 만 사용가능합니다.
         * <p>
         * 卡片视图图片（非必填）
         * 图片 URL，仅支持 jpg、jpeg、png 格式。
         */
        private String cardViewImage;

        /**
         * additionalImages String[] 비필수(非必填) 추가이미지 이미지 URL. jpg, jpeg, png 만 사용가능합니다. 최대 10개
         * <p>
         * 附加图片（非必填）
         * 图片 URL，仅支持 jpg、jpeg、png 格式，最多可上传 10 张。
         */
        private List<String> additionalImages;
    }

    /**
     * 상세내용
     * <p>
     * 详细内容
     */
    @Getter
    @Setter
    @ToString
    public static class DetailContent {
        /**
         * detail String 필수(必填) 상세설명 외부로의 링크는 제한되며
         * html을 입력하는 경우 일부 스크립트 및 스타일 태그는 제한됩니다.
         * <p>
         * 详细说明（必填）
         * 不允许外部链接；若输入 HTML，部分脚本和样式标签将被限制。
         */
        private String detail;

        /**
         * afterService String 필수(必填) A/S 안내 A/S 안내
         * <p>
         * 售后服务说明（必填）
         * A/S（售后服务）相关的说明信息。
         */
        private String afterService;

        /**
         * returnOrExchange String 필수(必填) 반품/교환 안내 반품/교환 안내
         * <p>
         * 退货/换货说明（必填）
         * 有关退货与换货的政策说明。
         */
        private String returnOrExchange;
    }

    /**
     * 인증정보
     * <p>
     * 认证信息
     */
    @Getter
    @Setter
    @ToString
    public static class Certification {

        /**
         * 필수(必填) 인증정보그룹
         * <p>
         * 认证信息组
         */
        private List<CertificationGroup> groups;
    }

    /**
     * 인증정보
     * <p>
     * 认证信息组
     */
    @Getter
    @Setter
    @ToString
    public static class CertificationGroup {
        /**
         * code String 필수(必填) 인증정보그룹번호
         * 01 : 전기용품/생활용품 KC인증
         * 02 : 어린이제품 KC인증
         * 03 : 방송통신기자재 KC인증
         * 04 : 생활화학 및 살생물제품
         * <p>
         * code String 必填 认证信息组编号
         * 01：电气用品/生活用品 KC 认证
         * 02：儿童用品 KC 认证
         * 03：广播通信设备 KC 认证
         * 04：生活化学及杀生物产品
         */
        private String code;

        /**
         * objectCode String 필수(必填) KC인증대상코드
         * 01 : KC인증대상
         * 02 : KC면제대상
         * 03 : KC인증대상 아님
         * 04 : 생활화학 및 살생물제품 대상
         * 05 : 생활화학 및 살생물제품 대상 아님
         * <p>
         * objectCode String 必填 KC认证对象代码
         * 01：KC认证对象
         * 02：KC豁免对象
         * 03：非KC认证对象
         * 04：生活化学及杀生物产品对象
         * 05：非生活化学及杀生物产品对象
         */
        private String objectCode;

        /**
         * exclusionTypeCode String 조건부 필수(有条件的必填) KC면제유형
         * KC인증대상코드가 KC면제대상(02)인 경우 필수
         * 02 : 구매대행면제대상
         * 03 : 병행수입면제대상
         * <p>
         * exclusionTypeCode String 有条件必填 KC豁免类型
         * 当 KC认证对象代码为 KC豁免对象(02) 时必填
         * 02：代购豁免对象
         * 03：平行进口豁免对象
         */
        private String exclusionTypeCode;

        /**
         * 필수(必填) 인증유형
         * <p>
         * 必填 认证类型
         */
        private List<CertificationGroupItem> items;
    }

    /**
     * 인증유형
     * <p>
     * 认证类型
     */
    @Getter
    @Setter
    @ToString
    public static class CertificationGroupItem {
        /**
         * code String 필수(必填) 인증유형코드 코드정보 참조
         * <p>
         * code String 必填 认证类型代码，请参考代码信息
         */
        private String code;

        /**
         * key String 필수(必填) 인증번호
         * <p>
         * key String 必填 认证编号
         */
        private String key;
    }

    /**
     * 의료기기 품목허가
     * <p>
     * 医疗器械品目许可
     */
    @Getter
    @Setter
    @ToString
    public static class Medical {
        /**
         * key String 비필수(非必填) 의료기기 품목허가번호
         * <p>
         * key String 非必填 医疗器械品目许可编号
         */
        private String key;

        /**
         * retail String 비필수(非必填) 의료기기 판매업신고 기관 및 번호
         * <p>
         * retail String 非必填 医疗器械销售业申报机构及编号
         */
        private String retail;

        /**
         * adNo Number 비필수(非必填) 의료기기사전광고심의번호
         * <p>
         * adNo Number 非必填 医疗器械事前广告审查编号
         */
        private Integer adNo;
    }

    /**
     * 리뷰
     * <p>
     * 评论
     */
    @Getter
    @Setter
    @ToString
    public static class Review {
        /**
         * displayYn String 비필수(非必填) 상품리뷰/후기 전시여부 Y: 전시 (기본값)
         * N: 비전시
         * <p>
         * displayYn String 非必填 商品评论/评价是否展示
         * Y：展示（默认值）
         * N：不展示
         */
        private String displayYn;

        /**
         * optionDisplayYn String 비필수(非必填) 상품리뷰/후기 옵션 노출여부 Y: 전시 (기본값)
         * N: 비전시 (상품리뷰/후기 비전시의 경우 옵션 노출여부 비전시 선택 불가)
         * <p>
         * optionDisplayYn String 非必填 商品评论/评价选项是否显示
         * Y：展示（默认值）
         * N：不展示（当商品评论/评价未展示时，无法选择“不展示”选项）
         */
        private String optionDisplayYn;
    }

    /**
     * 즉시할인
     * <p>
     * 立即折扣
     */
    @Getter
    @Setter
    @ToString
    public static class SellerDiscount {
        /**
         * amount Number 비필수(非必填) 할인수치 할인단위 코드에 따라 입력
         * <p>
         * amount Number 非必填 折扣数值，根据折扣单位代码输入
         */
        private BigDecimal amount;

        /**
         * discountMethodCode String 비필수(非必填) 할인단위 코드 01 : 원 (정액)
         * 02 : 퍼센트 (정률)
         * <p>
         * discountMethodCode String 非必填 折扣单位代码
         * 01：韩元（定额）
         * 02：百分比（定率）
         */
        private String discountMethodCode;

        /**
         * limitDateYn String 비필수(非必填) 할인 적용기간 설정여부
         * <p>
         * limitDateYn String 非必填 是否设置折扣适用期间
         */
        private String limitDateYn;

        /**
         * endDate String 비필수(非必填) 할인적용기간 종료일 YYYYMMDD
         * <p>
         * endDate String 非必填 折扣适用期间结束日期 YYYYMMDD
         */
        private String endDate;
    }

    /**
     * SK Pay 포인트
     * <p>
     * SK Pay 积分
     */
    @Getter
    @Setter
    @ToString
    public static class Point {
        /**
         * amount Number 비필수(非必填) 적립수치 적립단위 코드에 따라 입력
         * <p>
         * amount Number 非必填 积分数值，根据积分单位代码输入
         */
        private BigDecimal amount;

        /**
         * typeCode String 비필수(非必填) 적립단위 코드 01 : 퍼센트 (정률)
         * 02 : 원 (정액)
         * <p>
         * typeCode String 非必填 积分单位代码
         * 01：百分比（定率）
         * 02：韩元（定额）
         */
        private String typeCode;
    }

    /**
     * 복수구매할인
     * <p>
     * 多件购买折扣
     */
    @Getter
    @Setter
    @ToString
    public static class MultiPurchaseDiscount {
        /**
         * code String 필수(必填) 복수구매할인 설정 기준 01 : 수량
         * 02 : 금액
         * <p>
         * code String 必填 多重购买折扣设置基准
         * 01：数量
         * 02：金额
         */
        private String code;

        /**
         * basisAmount Number 필수(必填) 복수구매할인 기준 금액 및 수량
         * <p>
         * basisAmount Number 必填 多重购买折扣的基准金额或数量
         */
        private BigDecimal basisAmount;

        /**
         * amount Number 필수(必填) 복수구매할인 금액/율
         * <p>
         * amount Number 必填 多重购买折扣的金额或比率
         */
        private BigDecimal amount;

        /**
         * typeCode String 필수(必填) 복수구매할인 구분코드 01 : 퍼센트 (정률)
         * 02 : 원 (정액)
         * <p>
         * typeCode String 必填 多重购买折扣区分代码
         * 01：百分比（定率）
         * 02：韩元（定额）
         */
        private String typeCode;

        /**
         * useLimitDateYn String 비필수(非必填) 복수구매할인 적용기간 설정
         * <p>
         * useLimitDateYn String 非必填 多重购买折扣适用期间设置
         */
        private String useLimitDateYn;

        /**
         * startDate String 비필수(非必填) 복수구매할인 적용기간 시작일 YYYYMMDD
         * <p>
         * startDate String 非必填 多重购买折扣适用期间开始日期 YYYYMMDD
         */
        private String startDate;

        /**
         * endDate String 비필수(非必填) 복수구매할인 적용기간 종료일 YYYYMMDD
         * <p>
         * endDate String 非必填 多重购买折扣适用期间结束日期 YYYYMMDD
         */
        private String endDate;
    }

    /**
     * 희망후원
     * <p>
     * 希望捐赠
     */
    @Getter
    @Setter
    @ToString
    public static class HopeSupport {
        /**
         * amount Number 필수(必填) 적립수치 적립단위 코드에 따라 입력
         * <p>
         * amount Number 必填 积分数值，根据积分单位代码输入
         */
        private BigDecimal amount;

        /**
         * typeCode String 필수(必填) 적립단위 코드 01 : 퍼센트 (정률)
         * 02 : 원 (정액)
         * <p>
         * typeCode String 必填 积分单位代码
         * 01：百分比（定率）
         * 02：韩元（定额）
         */
        private String typeCode;
    }

    /**
     * 추가구성상품
     * <p>
     * 附加构成商品
     */
    @Getter
    @Setter
    @ToString
    public static class Composition {
        /**
         * 비필수(非必填) 추가구성상품 그룹
         * <p>
         * 其他配置商品组
         */
        private List<CompositionGroup> groups;
    }

    /**
     * 추가구성상품 그룹
     * <p>
     * 其他配置商品组
     */
    @Getter
    @Setter
    @ToString
    public static class CompositionGroup {
        /**
         * groupName String 필수(必填) 추가상품그룹명 추가 구성상품에 그룹핑이 가능합니다. 같은 그룹네임끼리 묶어집니다.
         * <p>
         * groupName String 必填 追加商品组名
         * 可以对追加配置商品进行分组，同一组名的商品将被归为一组。
         */
        private String groupName;

        /**
         * 필수(必填) 추가구성상품
         * <p>
         * 必填 追加配置商品
         */
        private List<CompositionGroupItem> items;
    }

    /**
     * 추가구성상품 그룹
     * <p>
     * 追加配置商品
     */
    @Getter
    @Setter
    @ToString
    public static class CompositionGroupItem {
        /**
         * name String 필수(必填) 추가상품명 40Byte 까지만 입력가능하며 특수 문자[&#39;,",%,&,<,>,#,†]는 입력할 수 없습니다.
         * <p>
         * name String 必填 追加商品名
         * 最多可输入 40Byte，不能输入特殊字符 [' ", %, &, <, >, #, †]
         */
        private String name;

        /**
         * sellerManagementCode String 비필수(非必填) 판매자추가상품번호 중복 가능
         * <p>
         * sellerManagementCode String 非必填 卖家追加商品编号，可重复
         */
        private String sellerManagementCode;

        /**
         * price Number 필수(必填) 추가구성상품 가격
         * <p>
         * price Number 必填 追加配置商品价格
         */
        private BigDecimal price;

        /**
         * quantity Number 필수(必填) 판매수량
         * <p>
         * quantity Number 必填 销售数量
         */
        private Integer quantity;

        /**
         * valueAddedTaxCode String 필수(必填) 부가세코드
         * 01 : 과세상품
         * 02 : 면세상품
         * 03 : 영세상품
         * <p>
         * valueAddedTaxCode String 必填 增值税代码
         * 01：应税商品
         * 02：免税商品
         * 03：零税商品
         */
        private String valueAddedTaxCode;

        /**
         * weight Number 조건부 필수(有条件的必填) 추가구성상품 무게 배송 주체 코드(deliveryClassificationCode)가 03(11번가 해외 배송)인 경우 또는 "전세계배송
         * 상품" 인 경우 추가구성 등록시 필수입니다. 단위 g
         * <p>
         * weight Number 有条件必填 追加配置商品重量
         * 当配送主体代码(deliveryClassificationCode)为 03（11st 海外配送）或为“全球配送商品”时，注册追加配置时必填。单位：克（g）
         */
        private BigDecimal weight;
    }

    /**
     * 구매제한
     * <p>
     * 购买限制
     */
    @Getter
    @Setter
    @ToString
    public static class PurchaseLimit {
        /**
         * minimumTypeCode String 비필수(非必填) 최소구매수량 설정코드 00 : 제한 안함
         * 01 : 1회 제한
         * <p>
         * minimumTypeCode String 非必填 最小购买数量设置代码
         * 00：不限制
         * 01：一次限制
         */
        private String minimumTypeCode;

        /**
         * minimumQuantity Number 비필수(非必填) 최소구매수량 개수
         * <p>
         * minimumQuantity Number 非必填 最小购买数量
         */
        private Integer minimumQuantity;

        /**
         * maximumTypeCode String 비필수(非必填) 최대구매수량 설정코드
         * 00 : 제한 안함
         * 01 : 1회 제한
         * 02 : 기간 제한
         * <p>
         * maximumTypeCode String 非必填 最大购买数量设置代码
         * 00：不限制
         * 01：一次限制
         * 02：周期限制
         */
        private String maximumTypeCode;

        /**
         * maximumQuantity Number 비필수(非必填) 최대구매수량 개수
         * <p>
         * maximumQuantity Number 非必填 最大购买数量
         */
        private Integer maximumQuantity;

        /**
         * repurchaseRestrictionDay Number 비필수(非必填) 재구매 제한기한 최대구매수량 기간제한(02) 설정시, 1~30, 단위 일
         * <p>
         * repurchaseRestrictionDay Number 非必填 再次购买限制期限
         * 当最大购买数量周期限制(02)启用时，范围 1~30，单位：天
         */
        private Integer repurchaseRestrictionDay;

        /**
         * minorPurchaseYn String 비필수(非必填) 미성년자 구매가능 여부 Y : 가능
         * N : 불가능
         * <p>
         * minorPurchaseYn String 非必填 未成年人是否可购买
         * Y：可以
         * N：不可以
         */
        private String minorPurchaseYn;

        /**
         * shoppingCartRestrictionYn String 비필수(非必填) 장바구니 담기 제한여부 Y: 제한
         * N: 제한 안함
         * <p>
         * shoppingCartRestrictionYn String 非必填 购物车添加限制
         * Y：限制
         * N：不限制
         */
        private String shoppingCartRestrictionYn;

        /**
         * purchaseUnit Number 비필수(非必填) 배수구매 제한
         * <p>
         * purchaseUnit Number 非必填 倍数购买限制
         */
        private Integer purchaseUnit;
    }

    /**
     * 사은품
     * <p>
     * 赠品
     */
    @Getter
    @Setter
    @ToString
    public static class Gift {
        /**
         * description String 필수(必填) 사은품 설명 글자수는 200byte로 제한됩니다. 한글100자, 영문/숫자 200자 이내로 입력해 주십시오.
         * <p>
         * description String 必填 礼品说明
         * 字数限制 200byte，韩文100字以内，英文/数字200字以内
         */
        private String description;

        /**
         * name String 필수(必填) 사은품명 글자수는 30byte로 제한됩니다. 한글15자, 영문/숫자 30자 이내로 입력해 주십시오.
         * <p>
         * name String 必填 礼品名称
         * 字数限制 30byte，韩文15字以内，英文/数字30字以内
         */
        private String name;

        /**
         * startDate String 필수(必填) 사은품 지급 시작일 YYYYMMDD
         * <p>
         * startDate String 必填 礼品发放开始日期 YYYYMMDD
         */
        private String startDate;

        /**
         * endDate String 필수(必填) 사은품 지급 종료일 YYYYMMDD
         * <p>
         * endDate String 必填 礼品发放结束日期 YYYYMMDD
         */
        private String endDate;
    }

    /**
     * 상품정보제공고시 상품정보고시 참조
     * 商品信息提供公示（必填）
     * 请参考商品信息公示
     */
    @Getter
    @Setter
    @ToString
    public static class Notification {
        /**
         * type Number 필수(必填) 유형카테고리번호 고시유형코드
         * <p>
         * type Number 必填 类型类别编号 公示类型代码
         */
        private Integer type;

        /**
         * items Object[] 필수(必填) 항목정보목록
         * <p>
         * items Object[] 必填 项目信息列表
         */
        private List<NotificationItem> items;
    }

    /**
     * 항목정보목록
     * <p>
     * 项目信息
     */
    @Getter
    @Setter
    @ToString
    public static class NotificationItem {
        /**
         * code String 필수(必填) 항목코드
         * <p>
         * code String 必填 项目代码
         */
        private String code;

        /**
         * name String 필수(必填) 항목값
         * <p>
         * name String 必填 项目值
         */
        private String name;
    }

    /**
     * 모델
     * <p>
     * 型号
     */
    @Getter
    @Setter
    @ToString
    public static class Model {
        /**
         * manufacturer String 필수(必填) 제조사 제조사는 텍스트 형태로만 입력하며 제조사가 없을 시 "없음"으로 입력합니다.
         * <p>
         * manufacturer String 必填 制造商
         * 制造商仅能以文本形式输入，如无制造商，请输入 "없음"（无）
         */
        private String manufacturer;

        /**
         * name String 필수(必填) 모델명 모델명은 텍스트 형태로만 입력하며 모델명이 없을 시 "없음"으로 입력합니다. (예시 모델명
         * : 기본 라인 셔츠 SQBAB9401)
         * <p>
         * name String 必填 型号名称
         * 型号名称仅能以文本形式输入，如无型号，请输入 "없음"（无）
         * （示例型号：基础款衬衫 SQBAB9401）
         */
        private String name;

        /**
         * code String 비필수(非必填) 모델코드 등록하실 상품 모델의 고유한 식별정보로, 영문+숫자, 숫자, 영문 등으로 조합된 모델번호를
         * 입력해주십시오. (예시 모델코드 : SQBAB9401)
         * <p>
         * code String 非必填 型号代码
         * 商品型号的唯一识别信息，请输入由字母+数字、数字或字母等组合的型号编号。
         * （示例型号代码：SQBAB9401）
         */
        private String code;
    }

    /**
     * 배송
     * <p>
     * 配送
     */
    @Getter
    @Setter
    @ToString
    public static class Delivery {
        /**
         * availableAreaCode String 비필수(非必填) 배송가능지역 코드 코드정보 참조. (기본값 : 전국)
         * <p>
         * availableAreaCode String 非必填 可配送地区代码
         * 参考代码信息。（默认值：全国）
         */
        private String availableAreaCode;

        /**
         * wayCode String 비필수(非必填) 배송방법
         * "전세계배송 상품" 인경우 택배 또는 우편(소포/등기)만 입력가능합니다. (기본값 : 택배)
         * 01 : 택배
         * 02 : 우편(소포/등기)
         * 03 : 직접전달(화물배달)
         * 04 : 퀵서비스
         * 05 : 배송필요없음
         * <p>
         * wayCode String 非必填 配送方式
         * “全球配送商品”情况下仅可输入快递或邮寄（包裹/挂号）。（默认值：快递）
         * 01 : 快递
         * 02 : 邮寄（包裹/挂号）
         * 03 : 直接交付（货运配送）
         * 04 : 快速服务
         * 05 : 无需配送
         */
        private String wayCode;

        /**
         * companyCode String 비필수(非必填) 발송택배사 코드정보 참조
         * <p>
         * companyCode String 非必填 发货快递公司
         * 参考快递公司代码信息
         */
        private String companyCode;

        /**
         * sendCloseTemplateNo Number 비필수(非必填) 발송마감 템플릿번호
         * 발송마감 템플릿번호 (오늘발송, 일반발송, 재고확인 후 순차발송(소량재고/제작상품) ) 1개
         * 등록 가능하며 선택입력 정보입니다. 기본적으로 배송방법이 택배인 상품에 한하여 유효하
         * 며 해외직구 상품, 예약판매상품, 주문제작상품, 셀러위탁배송 상품은 반영 대상에서 제외됩
         * 니다.
         * <p>
         * sendCloseTemplateNo Number 非必填 发货截止模板编号
         * 可注册1个发货截止模板编号（今日发货、普通发货、库存确认后顺序发货（少量库存/定制商品）），为可选信息。
         * 默认仅对快递配送商品有效，海外直购商品、预约销售商品、定制商品、卖家委托配送商品不适用
         */
        private Integer sendCloseTemplateNo;

        /**
         * availableBundleYn String 비필수(非必填) 묶음배송 여부 Y : 가능
         * N : 불가능
         * <p>
         * availableBundleYn String 非必填 是否允许合并配送
         * Y : 允许
         * N : 不允许
         */
        private String availableBundleYn;

        /**
         * payTypeCode String 필수(必填) 결제방법
         * 01 : 선결제/착불 가능 (deprecated)
         * 02 : 착불
         * 03 : 선결제
         * <p>
         * payTypeCode String 必填 付款方式
         * 01 : 预付款/货到付款可用（已废弃）
         * 02 : 货到付款
         * 03 : 预付款
         */
        private String payTypeCode;

        /**
         * returnChargeCode String 비필수(非必填) 반품 배송비 코드 01 : 왕복(편도x2)
         * 02 : 편도
         * <p>
         * returnChargeCode String 非必填 退货运费代码
         * 01 : 往返（单程×2）
         * 02 : 单程
         */
        private String returnChargeCode;

        /**
         * deliveryClassificationCode String 필수(必填) 배송 주체 코드
         * (기본값 : 업체배송)
         * 01 : 11번가 배송 (통합 ID의 출고지를 사용하는 경우)
         * 02 : 업체배송 (셀러가 배송을 처리하는 경우)
         * 03 : 11번가 해외 배송 (11번가 해외 통합 출고지를 사용하는 경우)
         * <p>
         * deliveryClassificationCode String 必填 配送主体代码
         * （默认值：卖家配送）
         * 01 : 11街配送（使用统一ID的发货地时）
         * 02 : 卖家配送（卖家处理配送时）
         * 03 : 11街海外配送（使用11街海外统一发货地时）
         */
        private String deliveryClassificationCode;

        /**
         * visitYn String 비필수(非必填) 방문수령가능여부 Y : 가능
         * N : 불가능
         * <p>
         * visitYn String 非必填 是否可到店自提
         * Y : 可以
         * N : 不可以
         */
        private String visitYn;

        /**
         * visitAddressSeq Number 비필수(非必填) 방문수령 주소 코드
         * <p>
         * visitAddressSeq Number 非必填 到店自提地址代码
         */
        private String visitAddressSeq;

        /**
         * returnAddressAbroadYn String 비필수(非必填) 반품/교환지 주소 해외 여부
         * (기본값 : 국내)
         * Y : 반품/교환지 해외
         * N : 반품/교환지 국내
         * <p>
         * returnAddressAbroadYn String 非必填 退货/换货地址是否海外
         * （默认值：国内）
         * Y : 退货/换货地址海外
         * N : 退货/换货地址国内
         */
        private String returnAddressAbroadYn;

        /**
         * sendAddressAbroadYn String 비필수(非必填) 출고지 주소 해외 여부 Y : 출고지 해외
         * N : 출고지 국내
         * <p>
         * sendAddressAbroadYn String 非必填 发货地地址是否海外
         * Y : 发货地海外
         * N : 发货地国内
         */
        private String sendAddressAbroadYn;

        /**
         * sendAddressSeq Number 비필수(非必填) 출고지 주소 코드 생략할 경우 기본주소로 자동 설정이 됩니다.
         * <p>
         * sendAddressSeq Number 非必填 发货地地址代码
         * 若省略，则自动设置为默认地址
         */
        private String sendAddressSeq;

        /**
         * returnAddressSeq Number 비필수(非必填) 반품/교환지 주소 코드 생략할 경우 기본주소로 자동 설정이 됩니다.
         * <p>
         * returnAddressSeq Number 非必填 退货/换货地址代码
         * 若省略，则自动设置为默认地址
         */
        private String returnAddressSeq;

        /**
         * globalSendAddressSeq Number 조건부 필수(有条件的必填) 글로벌 판매자 해외 출고지 주소 배송 주체 코드(deliveryClassificationCode)가 11번가 해외 배송(03) 인 경우 필수
         * <p>
         * globalSendAddressSeq Number 有条件必填 全球卖家海外发货地地址
         * 当配送主体代码(deliveryClassificationCode)为11街海外配送(03)时必填
         */
        private String globalSendAddressSeq;

        /**
         * globalReturnAddressSeq Number 조건부 필수(有条件的必填) 글로벌 판매자 반품/교환지 주소 배송 주체 코드(deliveryClassificationCode)가 11번가 해외 배송(03) 인 경우 필수
         * <p>
         * globalReturnAddressSeq Number 有条件必填 全球卖家退货/换货地址
         * 当配送主体代码(deliveryClassificationCode)为11街海外配送(03)时必填
         */
        private String globalReturnAddressSeq;

        /**
         * integrationSendAddressMemNo Number 비필수(非必填) 통합 출고지 ID 회원 번호
         * <p>
         * integrationSendAddressMemNo Number 非必填 统一发货地ID会员编号
         */
        private String integrationSendAddressMemNo;

        /**
         * integrationReturnAddressMemNo Number 비필수(非必填) 통합 반품/교환지 ID 회원 번호
         * <p>
         * integrationReturnAddressMemNo Number 非必填 统一退货/换货地ID会员编号
         */
        private String integrationReturnAddressMemNo;

        /**
         * sellerAbroadSendAddressCode String 조건부 필수(有条件的必填) 판매자 해외 출고지 지역 코드
         * 배송 주체 코드(deliveryClassificationCode)가 11번가 해외 배송(03) 인 경우 필수
         * 01 : 국내
         * 02 : 해외
         * <p>
         * sellerAbroadSendAddressCode String 有条件必填 卖家海外发货地地区代码
         * 当配送主体代码(deliveryClassificationCode)为11街海外配送(03)时必填
         * 01 : 国内
         * 02 : 海外
         */
        private String sellerAbroadSendAddressCode;

        /**
         * sellerAbroadReturnAddressCode String 조건부 필수(有条件的必填) 판매자 해외 반품/교환지 지역 코드
         * 배송 주체 코드(deliveryClassificationCode)가 11번가 해외 배송(03) 인 경우 필수
         * 01 : 국내
         * 02 : 해외
         * <p>
         * sellerAbroadReturnAddressCode String 有条件必填 卖家海外退货/换货地区代码
         * 当配送主体代码(deliveryClassificationCode)为11街海外配送(03)时必填
         * 01 : 国内
         * 02 : 海外
         */
        private String sellerAbroadReturnAddressCode;

        /**
         * 비필수(非必填) 전세계배송
         * 1. 셀러회원정보에 전세계배송 이용여부가 "노출 또는 이용"으로 되어있고
         * 2. 등록하려는 상품카테고리의 전세게배송 이용여부가 "이용(Y)"으로 되어있고 카테고리별
         * 전세계배송 가능여부확인
         * 3. 상품옵션이 "독립형"이 아니어야 하고
         * 4. 상품의 배송방법이 택배 또는 우편(소포/등기)로 되어있고
         * 5. 상품의 배송비설정이 무료 또는 결제방법이 선결제가능 혹은 선결제 필수이어야 하고
         * 6. 통관용으로 사용될 생산지 국가를 반드시 선택해야 하고
         * 7. 상품무게는 반드시 입력해야 하고
         * 8. 상품의 출고지가 "국내주소" 인 경우에만 전세계배송이 가능.
         * <p>
         * global 非必填 全球配送
         * 1. 卖家会员信息中全球配送使用状态为“显示或可用”
         * 2. 注册商品类别的全球配送使用状态为“可用(Y)”，并确认各类别是否支持全球配送
         * 3. 商品选项不得为“独立型”
         * 4. 商品配送方式为快递或邮寄（包裹/挂号）
         * 5. 商品运费设置为免费，或付款方式允许预付款/必须预付款
         * 6. 必须选择用于报关的生产地国家
         * 7. 必须输入商品重量
         * 8. 仅当商品发货地为“国内地址”时可使用全球配送
         */
        private Global global;

        /**
         * 필수(必填) 배송비
         * <p>
         * charge 必填 配送费用
         */
        private Charge charge;
    }

    /**
     * 전세계배송
     * <p>
     * 全球配送
     */
    @Getter
    @Setter
    @ToString
    public static class Global {
        /**
         * hsCode String 필수(必填) 전세계배송 HSCode
         * 全球配送HSCode
         * <a href="http://soffice.11st.co.kr/product/ProductAjax.tmall?method=getGlobalHsCodeManagerExcel">...</a>
         */
        private String hsCode;
        /**
         * weight Number 필수(必填) 상품 무게 단위 : g
         * 商品重量单位：g
         */
        private BigDecimal weight;
        /**
         * countryOfOrigin String 필수(必填) 생산지국가(통관용)
         * 生产国家（通关用）
         * <a href="http://soffice.11st.co.kr/product/ProductAjax.tmall?method=getNationExcel">...</a>
         */
        private String countryOfOrigin;
    }

    /**
     * 배송비
     * <p>
     * 配送费用
     */
    @Getter
    @Setter
    @ToString
    public static class Charge {
        /**
         * chargeTypeCode String 필수(必填) 배송비 설정 기준코드
         * 01 : 무료
         * 02 : 고정 배송비
         * 03 : 상품 조건부 무료
         * 04 : 수량별 차등, 수량별 차등은 조건추가에 따라 배송비를 최대 10개까지 설정 가능
         * 05 : 1개당 배송비
         * 07 : 판매자 조건부 배송비, 셀러오피스 > 회원정보 > 판매정보설정 메뉴에서 판매자 조건
         * 부 배송비 설정 필요
         * 08 : 출고지 조건부 배송비
         * 09 : 11번가 통합 출고지 배송비
         * 10 : 11번가해외배송조건부배송비 (11번가 해외 배송을 사용하는 경우)
         * <p>
         * 运费设置基准代码
         * 01 : 免费
         * 02 : 固定运费
         * 03 : 商品条件包邮
         * 04 : 按数量分级, 按数量分级可根据条件追加最多设置10个运费
         * 05 : 每个运费
         * 运费
         * 07 : 卖家条件运费, 需要在卖家办公室>会员信息>销售信息设置菜单中设置卖家条件
         * 08 : 发货地条件运费
         * 09 : 11街统一发货地运费
         * 10 : 11街海外配送条件运费 (使用11街海外配送时)
         */
        private String chargeTypeCode;
        /**
         * charge Number 조건부 필수(有条件的必填) 배송비 배송비 설정 기준코드가 고정 배송비(02) 또는 상품 조건부 무료(03) 인 경우 필수
         * <p>
         * 运费 运费设置基准代码为固定运费(02)或商品条件包邮(03)时必填
         */
        private BigDecimal charge;
        /**
         * additionalChargeTypeCode String 비필수(非必填) 추가 배송비 코드
         * 전세계배송이 아니고 배송 결제방법(payTypeCode)이 착불(02)인 경우에만 설정 가능
         * 01 : (상품상세참고)
         * 02 : (상품별 차등 적용)
         * 03 : (지역별 차등 적용)
         * 04 : (상품/지역별 차등)
         * 06 : (서울/경기 무료, 이외 추가비용)
         * <p>
         * 附加运费代码
         * 非全球配送且运费支付方式(payTypeCode)为到付(02)时才能设置
         * 01 : (参考商品详情)
         * 02 : (按商品差别适用)
         * 03 : (按地区差别适用)
         * 04 : (商品/地区差别)
         * 06 : (首尔/京畿道免费, 其他地区附加费用)
         */
        private String additionalChargeTypeCode;
        /**
         * jejuCharge Number 비필수(非必填) 제주 배송비
         * <p>
         * 济州岛运费
         */
        private BigDecimal jejuCharge;
        /**
         * islandCharge Number 비필수(非必填) 도서산간 배송비
         * <p>
         * 偏远岛屿地区运费
         */
        private BigDecimal islandCharge;
        /**
         * abroadCancelCharge Number 조건부 필수(有条件的必填) 해외취소 배송비 배송 주체 코드(deliveryClassificationCode)가 11번가 해외 배송(03) 인 경우 필수
         * 10원 단위로 입력
         * <p>
         * 海外取消运费 配送主体代码(deliveryClassificationCode)为11街海外配送(03)时必填
         * 以10韩元为单位输入
         */
        private BigDecimal abroadCancelCharge;
        /**
         * returnCharge Number 필수(必填) 반품 배송비 10원 단위로 입력
         * <p>
         * 退货运费 以10韩元为单位输入
         */
        private BigDecimal returnCharge;
        /**
         * exchangeCharge Number 필수(必填) 교환 배송비(왕복) 10원 단위로 입력
         * <p>
         * 换货运费(往返) 以10韩元为单位输入
         */
        private BigDecimal exchangeCharge;
        /**
         * freeBasisAmount Number 조건부 필수(有条件的必填) 상품조건부 무료 상품기준금액 배송비 설정 기준코드가 상품 조건부 무료(03) 인 경우 필수
         * <p>
         * 商品条件包邮商品基准金额 运费设置基准代码为商品条件包邮(03)时必填
         */
        private BigDecimal freeBasisAmount;
        /**
         * 조건부 필수(有条件的必填) 수량별 차등 범위 배송비 설정 기준코드가 수량별 차등(04) 인 경우 필수. 최대 10개
         * <p>
         * 按数量分级范围 运费设置基准代码为按数量分级(04)时必填. 最多10个
         */
        private Range range;
    }

    /**
     * 수량별 차등 범위 배송비 설정 기준코드가 수량별 차등(04) 인 경우 필수. 최대 10개
     * <p>
     * 按数量分级范围 运费设置基准代码为按数量分级(04)时必填. 最多10个
     */
    @Getter
    @Setter
    @ToString
    public static class Range {
        /**
         * min Number 필수(必填) 수량별 차등 기준 ~이상 수량
         * <p>
         * min Number 必填 数量分级标准
         * ~以上数量
         */
        private BigDecimal min;

        /**
         * max Number 필수(必填) 수량별 차등 기준 ~이하 수량
         * <p>
         * max Number 必填 数量分级标准
         * ~以下数量
         */
        private BigDecimal max;

        /**
         * charge Number 필수(必填) 수량별 가격
         * <p>
         * charge Number 必填 数量分级价格
         */
        private BigDecimal charge;
    }

    @Getter
    @Setter
    @ToString
    public static class TodaySend {
        /**
         * todaySendCanQty Number
         * <p>
         * todaySendCanQty Number
         * 今日可发数量
         */
        private BigDecimal todaySendCanQty;

        /**
         * todaySendCanQtyOverOrderPeriod Number
         * <p>
         * todaySendCanQtyOverOrderPeriod Number
         * 今日可发数量（超过订单周期部分）
         */
        private BigDecimal todaySendCanQtyOverOrderPeriod;
    }

    /**
     * 도서/음반/DVD
     * <p>
     * 书籍/音像/DVD
     */
    @Getter
    @Setter
    @ToString
    public static class BookAndAlbum {
        /**
         * marketPrice Number 조건부 필수(有条件的必填) 정가
         * 도서 카테고리인 경우 필수.(음반, DVD/블루레이제외)
         * 도서 정가제 관련 규정을 준수하여 등록하셔야 합니다.
         * 도서정가제 규정을 위반하거나 정가를 허위로 등록할 경우 법적 책임은 판매자에게 있으며,
         * 판매중지 등의 불이익을 받을 수 있습니다.
         * 도서 정가제: 18개월 미만의 신간도서의 경우 정가의 10% 이내 할인, 적립율은 판매가의 최
         * 대 10% 이내 적용 가능합니다.(마일리지 등 합산 적립)
         * <p>
         * marketPrice Number 条件必填（有条件的必填）定价
         * 书籍类目必填（音乐、DVD/蓝光除外）
         * 注册时需遵守书籍定价相关规定。
         * 若违反书籍定价规定或虚假登记定价，法律责任由卖家承担，可能会受到销售停止等不利影响。
         * 书籍定价规定：18个月内的新书可在定价10%以内折扣，积分率可在售价最大10%以内适用（含里程积分等合计）。
         */
        private BigDecimal marketPrice;

        /**
         * manufacturerDate String 조건부 필수(有条件的必填) 출판/출시일자 도서/음반/DVD 카테고인 경우 필수.
         * 출판일자를 허위로 기재할경우, 도서문화진흥법에 의해 처벌 받을 수 있습니다.
         * <p>
         * manufacturerDate String 条件必填（有条件的必填）出版/发行日期
         * 书籍/音乐/DVD类目必填
         * 若虚假填写出版日期，将根据《图书文化振兴法》受到处罚。
         */
        private String manufacturerDate;

        /**
         * originalTitle String 비필수(非必填) 원제 한글 50자, 영문/숫자 100자 이내로 입력해 주십시오.
         * <p>
         * originalTitle String 非必填 原名
         * 韩文50字以内，英文/数字100字以内
         */
        private String originalTitle;

        /**
         * artist String 비필수(非必填) 아티스트/감독(배우) 한글 50자, 영문/숫자 100자 이내로 입력해 주십시오.
         * <p>
         * artist String 非必填 艺术家/导演(演员)
         * 韩文50字以内，英文/数字100字以内
         */
        private String artist;

        /**
         * albumLabel String 비필수(非必填) 음반 라벨 한글 100자, 영문/숫자 200자 이내로 입력해 주십시오.
         * <p>
         * albumLabel String 非必填 唱片厂牌
         * 韩文100字以内，英文/数字200字以内
         */
        private String albumLabel;

        /**
         * manufacturer String 조건부 필수(有条件的必填) 제조사 음반, 음반[TAPE], DVD 카테고리인 경우 필수
         * 한글 100자, 영문/숫자 200자 이내로 입력해 주십시오.
         * <p>
         * manufacturer String 条件必填（有条件的必填）制造商
         * 音乐、音乐[TAPE]、DVD类目必填
         * 韩文100字以内，英文/数字200字以内
         */
        private String manufacturer;

        /**
         * albumName String 조건부 필수(有条件的必填) 앨범명 음반, 음반[TAPE] 카테고리인 경우 필수
         * 한글 100자, 영문/숫자 200자 이내로 입력해 주십시오.
         * <p>
         * albumName String 条件必填（有条件的必填）专辑名
         * 音乐、音乐[TAPE]类目必填
         * 韩文100字以内，英文/数字200字以内
         */
        private String albumName;

        /**
         * dvdTitle String 조건부 필수(有条件的必填) DVD 타이틀 DVD 카테고리인 경우 필수
         * 한글 100자, 영문/숫자 200자 이내로 입력해 주십시오.
         * <p>
         * dvdTitle String 条件必填（有条件的必填）DVD标题
         * DVD类目必填
         * 韩文100字以内，英文/数字200字以内
         */
        private String dvdTitle;

        /**
         * yearEndTaxYn String 비필수(非必填) 연말정산 소득공제 여부
         * 도서/음반, 티켓/공연, ebook, 쇼킹티켓 (단, 도서/음반 카테고리 중 음반, DVD, 잡지는 소득
         * 공제 제외) 상품에 한하여 연말정산 소득 공제여부를 설정해주세요.
         * Y:환급 가능
         * N:환급 불가
         * <p>
         * yearEndTaxYn String 非必填 年末所得税抵扣情况
         * 仅适用于书籍/音乐、票务/演出、电子书、震撼票（但书籍/音乐类目中音乐、DVD、杂志除外）
         * Y: 可退税
         * N: 不可退税
         */
        private String yearEndTaxYn;
    }

    /**
     * 옵션
     * <p>
     * 选项
     */
    @Getter
    @Setter
    @ToString
    public static class Option {
        /**
         * quantity Number 비필수(非必填) 일괄재고수량 설정 옵션별 재고 수량 일괄 설정
         * <p>
         * 批量设置各选项的库存数量
         */
        private BigDecimal quantity;
        /**
         * optionPrice Number 비필수(非必填) 일괄옵션가 설정 옵션별 옵션가 일괄 설정
         * <p>
         * 批量设置各选项的选项价格
         */
        private BigDecimal optionPrice;
        /**
         * addWeight Number 비필수(非必填) 일괄옵션추가무게 설정 옵션별 추가무게 일괄 설정
         * <p>
         * 批量设置各选项的附加重量
         */
        private BigDecimal addWeight;
        /**
         * sortCode String 비필수(非必填) 상품상세 옵션값 노출 방식 코드
         * 00 : 등록순
         * 01 : 옵션값 가나다순
         * 02 : 옵션값 가나다 역순
         * 03 : 옵션가격 낮은 순
         * 04 : 옵션가격 높은 순
         * <p>
         * 商品详情选项值显示方式代码
         * 00 : 按注册顺序
         * 01 : 选项值按韩文字母顺序
         * 02 : 选项值按韩文字母逆序
         * 03 : 按选项价格从低到高
         * 04 : 按选项价格从高到低
         */
        private String sortCode;
        /**
         * 비필수(非必填) 선택형(조합형)
         * <p>
         * 选择型（组合型）
         */
        private Combination combination;
        /**
         * 비필수(非必填) 작성형
         * <p>
         * 填写型
         */
        private Custom custom;
        /**
         * 비필수(非必填) 계산형
         * 가구/수납가구/학생가구, 침구/커튼/카페트, 홈/인테리어/DIY 카테고리에서만 사용 가능합니
         * 다.
         * 계산형 옵션은 조합형 옵션을 최소 1개 이상 함께 등록해야 사용 가능합니다.
         * 계산형 옵션은 작성형 옵션과 동시에 사용할 수 없습니다.
         * 추가금 계산 식은 아래와 같으며, 계산 후 원 단위는 반올림 됩니다.
         * ((가로 입력값 x 세로 입력값) - (가로 판매최소값 x 세로 판매최소값)) x 단가 기준값)
         * <p>
         * 计算型
         * 仅限家具/收纳家具/学生家具、床上用品/窗帘/地毯、家居/室内装饰/DIY类别使用
         * 计算型选项需要至少注册1个组合型选项才能使用
         * 计算型选项不能与填写型选项同时使用
         * 附加金额计算公式如下，计算后以韩元为单位四舍五入
         * ((横向输入值 x 纵向输入值) - (横向销售最小值 x 纵向销售最小值)) x 单价基准值)
         */
        private Calculated calculated;
    }

    /**
     * 선택형(조합형)
     * <p>
     * 选择型（组合型）
     */
    @Getter
    @Setter
    @ToString
    public static class Combination {
        /**
         * 필수(必填) 첫번째 옵션 정보의 옵션 값은 최대 100개
         * <p>
         * 必填 第一个选项信息的选项值最多100个
         */
        private List<CombinationName> names;

        /**
         * 필수(必填) 최대 1,000개
         * <p>
         * 必填 最多1,000个
         */
        private List<CombinationItem> items;
    }

    /**
     * 첫번째 옵션 정보의 옵션 값은 최대 100개
     * <p>
     * 第一个选项信息的选项值最多100个
     */
    @Getter
    @Setter
    @ToString
    public static class CombinationName {
        /**
         * name String 필수(必填) 옵션명 한글 20자, 영문/숫자 40자
         * <p>
         * 必填 选项名 韩文20字以内，英文/数字40字以内
         */
        private String name;

        /**
         * values String[] 필수(必填) 옵션값 한글 25자, 영문/숫자 50자
         * <p>
         * 必填 选项值 韩文25字以内，英文/数字50字以内
         */
        private List<String> values;
    }

    /**
     * 최대 1,000개
     * <p>
     * 最多1,000个
     */
    @Getter
    @Setter
    @ToString
    public static class CombinationItem {
        /**
         * values Object[] 필수(必填) 옵션 매핑값 names.values에 해당 하는 옵션들의 매핑 정보.
         * ex> [{"레드", "250"}, {"레드", "260"}, {"블랙", "260"}, {"블랙", "270"}, {"블랙", "280"}]
         * <p>
         * 必填 选项映射值 对应 names.values 的选项映射信息。
         * 例如: [{"红色", "250"}, {"红色", "260"}, {"黑色", "260"}, {"黑色", "270"}, {"黑色", "280"}]
         */
        private List<Map<String, String>> values;

        /**
         * price Number 필수(必填) 옵션가격 기본 판매가의 +100%/-50%까지 설정할 수 있습니다.
         * 옵션가격이 0원인 상품이 반드시 1개 이상 있어야 합니다.
         * <p>
         * 必填 选项价格 可设置为基本销售价的 +100%/-50%。
         * 商品中至少要有一个选项价格为0元。
         */
        private BigDecimal price;

        /**
         * quantity Number 필수(必填) 옵션재고 옵션 재고 값
         * <p>
         * 必填 选项库存 选项库存数量
         */
        private BigDecimal quantity;

        /**
         * sellerStockCode String 비필수(非必填) 판매자 관리 옵션 재고코드 판매자 관리 재고번호
         * <p>
         * 非必填 卖家管理选项库存代码 卖家管理库存编号
         */
        private String sellerStockCode;

        /**
         * weight Number 조건부 필수(有条件的必填) 옵션추가무게
         * 배송 주체 코드(deliveryClassificationCode)가 11번가 해외 배송(03)
         * 또는 "전세계 배송" 상품인 경우 필수
         * 단위 : g
         * <p>
         * 有条件必填 选项附加重量
         * 当配送主体代码(deliveryClassificationCode)为 11번가 海外配送(03) 或者商品为 "全球配送" 时必填
         * 单位：克(g)
         */
        private BigDecimal weight;
    }

    /**
     * 작성형
     * <p>
     * 合成
     */
    @Getter
    @Setter
    @ToString
    public static class Custom {
        /**
         * items Object[] 필수(必填) 구매자 작성형 옵션 최대 5개
         * <p>
         * 最多5个单张选项
         */
        private List<CustomItem> items;
    }

    /**
     * 구매자 작성형 옵션 최대 5개
     * <p>
     * 最多5个单张选项
     */
    @Getter
    @Setter
    @ToString
    public static class CustomItem {
        /**
         * name String 필수(必填) 작성형 옵션명 공백포함 20자까지 입력가능합니다.
         * <p>
         * 必填 自定义选项名 可输入最多20个字符（包含空格）
         */
        private String name;

        /**
         * statusCode String 필수(必填) 작성형 옵션 상태코드 01 : 사용함
         * 02 : 임시품절
         * <p>
         * 必填 自定义选项状态代码
         * 01 : 使用中
         * 02 : 临时缺货
         */
        private String statusCode;
    }

    /**
     * 계산형
     * 가구/수납가구/학생가구, 침구/커튼/카페트, 홈/인테리어/DIY 카테고리에서만 사용 가능합니
     * 다.
     * 계산형 옵션은 조합형 옵션을 최소 1개 이상 함께 등록해야 사용 가능합니다.
     * 계산형 옵션은 작성형 옵션과 동시에 사용할 수 없습니다.
     * 추가금 계산 식은 아래와 같으며, 계산 후 원 단위는 반올림 됩니다.
     * ((가로 입력값 x 세로 입력값) - (가로 판매최소값 x 세로 판매최소값)) x 단가 기준값)
     * <p>
     * 计算型
     * 仅可用于家具/储物家具/学生家具、床上用品/窗帘/地毯、家居/室内装修/DIY 分类。
     * 计算型选项必须至少与一个组合型选项一起注册才能使用。
     * 计算型选项不能与自定义选项同时使用。
     * 追加费用计算公式如下，计算后以元为单位四舍五入。
     * ((输入的宽度 x 输入的高度) - (销售最小宽度 x 销售最小高度)) x 单价基准值
     */
    @Getter
    @Setter
    @ToString
    public static class Calculated {
        /**
         * unitPrice Number 필수(必填) 단가기준값 입력 숫자 범위 0.001 ~ 1,000,000
         * <p>
         * 必填 单价基准值 输入数字范围 0.001 ~ 1,000,000
         */
        private BigDecimal unitPrice;

        /**
         * unitCode String 필수(必填) 기준 단위코드
         * 01 : mm (밀리미터)
         * 02 : cm (센티미터)
         * 03 : m (미터)
         * <p>
         * 必填 基准单位代码
         * 01 : 毫米(mm)
         * 02 : 厘米(cm)
         * 03 : 米(m)
         */
        private String unitCode;

        /**
         * unit Number 필수(必填) 판매단위-숫자 입력 숫자 범위 1 ~ 1,000,000
         * <p>
         * 必填 销售单位-数字 输入数字范围 1 ~ 1,000,000
         */
        private Integer unit;

        /**
         * 비필수(非必填) 최대 2개
         * <p>
         * 非必填 最多2个
         */
        private List<CalculatedItem> items;
    }

    /**
     * 최대 2개
     * <p>
     * 最多2个
     */
    @Getter
    @Setter
    @ToString
    public static class CalculatedItem {
        /**
         * name String 필수(必填) 계산형 옵션명 최대 20byte, 초과 내용은 삭제
         * <p>
         * 必填 计算型选项名称 最大20字节，超出内容将被删除
         */
        private String name;

        /**
         * min Number 필수(必填) 계산형 옵션 판매최소값 입력 숫자 범위 1~1,000,000
         * <p>
         * 必填 计算型选项销售最小值 输入数字范围 1~1,000,000
         */
        private Integer min;

        /**
         * max Number 필수(必填) 계산형 옵션 판매최대값 입력 숫자 범위 1~1,000,000
         * <p>
         * 必填 计算型选项销售最大值 输入数字范围 1~1,000,000
         */
        private Integer max;
    }
}

